bitkeeper revision 1.1159.93.1 (41556622dHm-ebfFQ37g3zM37ASpCw)
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Sat, 25 Sep 2004 12:35:46 +0000 (12:35 +0000)
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Sat, 25 Sep 2004 12:35:46 +0000 (12:35 +0000)
extra debug

xen/arch/x86/memory.c
xen/arch/x86/shadow.c
xen/include/asm-x86/shadow.h

index 0c3fcc5966140d55d83faf176e95de0f359dc97e..baf8a040ff84bce66c501f399af7b4f3bd0a168d 100644 (file)
@@ -1864,7 +1864,7 @@ void ptwr_status(void)
 
 void audit_domain( struct domain *d)
 {
-    int ttot=0, ctot=0;
+    int ttot=0, ctot=0, io_mappings=0, lowmem_mappings=0;
     void adjust ( struct pfn_info *page, int dir, int adjtype )
     {
         int count = page->count_info & PGC_count_mask;
@@ -2059,7 +2059,7 @@ void audit_domain( struct domain *d)
 
                     if ( l1page->u.inuse.domain != d )
                     {
-                        printk("Skip page belowing to other dom %p\n",
+                        printk("L2: Skip bizare page belowing to other dom %p\n",
                                l1page->u.inuse.domain);    
                         continue;
                     }
@@ -2128,6 +2128,18 @@ void audit_domain( struct domain *d)
                     unsigned long l1pfn = pt[i]>>PAGE_SHIFT;
                     struct pfn_info *l1page = &frame_table[l1pfn];
 
+                   if ( l1pfn < 0x100 )
+                   {
+                       lowmem_mappings++;
+                       continue;
+                   }
+
+                   if ( l1pfn > max_page )
+                   {
+                       io_mappings++;
+                       continue;
+                   }
+
                     if ( pt[i] & _PAGE_RW )
                     {
 
@@ -2144,8 +2156,13 @@ void audit_domain( struct domain *d)
 
                     if ( l1page->u.inuse.domain != d )
                     {
-                        printk("Skip page belowing to other dom %p\n",
-                               l1page->u.inuse.domain);    
+                        printk("Audit %d: [%lx,%x] Skip foreign page dom=%lx pfn=%lx c=%08x t=%08x m2p=%lx\n",
+                              d->domain, pfn, i,
+                               (unsigned long)l1page->u.inuse.domain,
+                              l1pfn,
+                              l1page->count_info,
+                              l1page->u.inuse.type_info,
+                              machine_to_phys_mapping[l1pfn]);    
                         continue;
                     }
 
@@ -2156,13 +2173,15 @@ void audit_domain( struct domain *d)
             unmap_domain_mem(pt);
 
             break;
-        }
-        
-
+        }       
 
         list_ent = frame_table[pfn].list.next;
     }
 
+    if ( io_mappings>0 || lowmem_mappings>0 )
+       printk("Audit %d: Found %d lowmem mappings and %d io mappings\n",
+              d->domain, lowmem_mappings, io_mappings);
+
     /* phase 2 */
 
     ctot = ttot = 0;
@@ -2252,8 +2271,11 @@ void audit_domain( struct domain *d)
                     unsigned long l1pfn = pt[i]>>PAGE_SHIFT;
                     struct pfn_info *l1page = &frame_table[l1pfn];
 
-                    if ( l1page->u.inuse.domain == d)
-                        adjust( l1page, 1, 0 );
+                    if ( l1page->u.inuse.domain != d) continue;
+                   if ( l1pfn < 0x100 ) continue;
+                   if ( l1pfn > max_page ) continue;
+
+                   adjust( l1page, 1, 0 );
 #endif
                 }
             }
@@ -2286,8 +2308,7 @@ void audit_domains(void)
 
     for_each_domain ( d )
     {
-        if ( d->domain > 0 )
-            audit_domain(d);
+       audit_domain(d);
     }
 }
 
index 486fd94441aa0fd67e40e997e059d52a0edd72e7..ed2d4dc3beb8670a8f69e1fdf36da219486a2f05 100644 (file)
@@ -385,9 +385,12 @@ static int shadow_mode_table_op(struct domain *d,
                                        0, bytes);
                }
 
+#if 0   /* This optimisation is dangerous for some uses of this function.
+                disable for the moment */
         /* Might as well stop the domain as an optimization. */
                if ( zero )
             domain_pause_by_systemcontroller(d);
+#endif
 
                break;
     }
@@ -487,8 +490,21 @@ int shadow_mode_control(struct domain *d, dom0_shadow_control_t *sc)
 
 static inline struct pfn_info *alloc_shadow_page(struct mm_struct *m)
 {
+       struct pfn_info *page;
     m->shadow_page_count++;
-    return alloc_domheap_page(NULL);
+    page = alloc_domheap_page(NULL);
+
+       if( unlikely(page == NULL) )
+       {
+               printk("Couldn't alloc shadow page! count=%d\n",
+                          m->shadow_page_count);
+               SH_VLOG("Shadow tables l1=%d l2=%d",
+                               perfc_value(shadow_l1_pages), 
+                               perfc_value(shadow_l2_pages));
+               BUG();  // FIXME: try a shadow flush to free up some memory
+       }
+
+       return page;
 }
 
 void unshadow_table( unsigned long gpfn, unsigned int type )
index 60b2ef3ba9d0ac9e84e343d7399462efd5ad50d3..5914d62b4c20548d042ddaf590266a8cbb433a06 100644 (file)
@@ -118,17 +118,20 @@ static inline int __mark_dirty( struct mm_struct *m, unsigned int mfn )
     }
     else
     {
-        SH_LOG("mark_dirty OOR! mfn=%x pfn=%x max=%x (mm %p)",
-               mfn, pfn, m->shadow_dirty_bitmap_size, m );
-        SH_LOG("dom=%p caf=%08x taf=%08x\n", 
-               frame_table[mfn].u.inuse.domain,
-               frame_table[mfn].count_info, 
-               frame_table[mfn].u.inuse.type_info );
+               if ( mfn < max_page )
                {
-                       extern void show_trace(unsigned long *esp);             
-                       unsigned long *esp;
-                       __asm__ __volatile__ ("movl %%esp,%0" : "=r" (esp) : );
-                       show_trace(esp);
+                       SH_LOG("mark_dirty OOR! mfn=%x pfn=%x max=%x (mm %p)",
+                                  mfn, pfn, m->shadow_dirty_bitmap_size, m );
+                       SH_LOG("dom=%p caf=%08x taf=%08x\n", 
+                                  frame_table[mfn].u.inuse.domain,
+                                  frame_table[mfn].count_info, 
+                                  frame_table[mfn].u.inuse.type_info );
+                       {
+                               extern void show_trace(unsigned long *esp);             
+                               unsigned long *esp;
+                               __asm__ __volatile__ ("movl %%esp,%0" : "=r" (esp) : );
+                               show_trace(esp);
+                       }
                }
     }